package com.air.mapper;

import com.air.annotation.AutoFill;
import com.air.dto.FlightPageQueryDTO;
import com.air.entity.Flight;
import com.air.enumeration.OperationType;
import com.air.vo.FlightVO;
import com.github.pagehelper.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface FlightMapper {

    /**
     * 添加航班信息到数据库。
     *
     * 该方法通过@AutoFill注解自动填充操作类型为INSERT，表明这是一个插入数据的操作。
     * 使用此方法可以将一个新的航班对象flight添加到数据库中，flight对象包含了航班的相关信息。
     *
     * @param flight 待插入的航班对象，包含航班的详细信息。
     */
    @AutoFill(value = OperationType.INSERT)
    void insert(Flight flight);



    /**
     * 分页查询
     * @param flightPageQueryDTO
     * @return
     */
    Page<FlightVO> pageQuery(FlightPageQueryDTO flightPageQueryDTO);



    /**
     * 根据航班ID查询航班详细信息以及对应的航空公司名称。
     *
     * 通过SQL查询语句，从flight表和airline表的左外连接中获取指定航班ID的所有信息。
     * 包括航班的基本信息（f.*）以及所属航空公司的名称（a.name as airlineName）。
     * 使用MyBatis的@Select注解将SQL语句映射到方法上，实现根据航班ID获取详细信息的功能。
     *
     * @param id 航班的唯一标识ID。
     * @return 返回包含航班详细信息及航空公司名称的Flight对象。
     */
    @Select("select f.*,a.name as airlineName from flight f left outer join airline a on f.airline_id = a.id where f.id=#{id}")
    Flight getByIdWithAirline(Long id);


    /**
     * 批量删除。

     * 该方法通过传入一个ID列表，一次性删除数据库中对应的所有实体。这种方法相比于逐个删除，
     * 可以显著提高删除操作的效率，减少数据库交互的次数。
     *
     * @param ids 待删除实体的ID列表。这个列表中的每个ID都对应一个需要被删除的实体。
     */
    void deleteByIds(List<Long> ids);


    /**
     * 修改航班信息。
     *
     * 该方法通过接收一个Flight对象来更新数据库中相应航班的信息。使用@AutoFill注解来自动填充操作类型为UPDATE，
     * 以便于操作日志的记录和审计。方法本身不返回任何值，更新操作的结果依赖于数据库操作的成功与否。
     *
     * @param flight 待更新的航班对象，包含需要修改的新信息。
     */
    @AutoFill(value = OperationType.UPDATE)
    void update(Flight flight);


    /**
     * 根据航空公司ID查询航班信息。
     *
     * 该方法通过一个复杂的SQL查询，联接flight和airline表，以获取特定航空公司ID对应的航班详情。
     * 包括航班的各种信息以及航空公司的名称。
     *
     * @param flight 查询条件对象，其中包含了待查询的航班信息。此对象中可能包含航空公司ID等用于筛选数据的字段。
     * @return 返回一个航班信息的列表，这些信息属于指定的航空公司。
     */
    @Select("select f.*,a.name as airlineName from flight f left join airline a on f.airline_id = a.id where a.id=#{airlineId}")
    List<Flight> list(Flight flight);


    /**
     * 根据航班ID查询航班信息。
     *
     * 此方法使用MyBatis的注解方式定义了一个SQL查询语句，用于从flight表中根据指定的ID获取相应的航班记录。
     * @param id 航班的唯一标识ID，作为查询条件。
     * @return 返回匹配ID的航班对象。如果不存在匹配的记录，则返回null。
     */
    @Select("select * from flight where id=#{id}")
    Flight getById(Long id);

}
